<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>

<window title="Bug 1277803 test"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        width="600"
        height="600"
        onload="runTest();">

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>

  <body xmlns="http://www.w3.org/1999/xhtml">
  </body>

  <script type="application/javascript"><![CDATA[
    SimpleTest.requestCompleteLog();
    let Ci = Components.interfaces;
    let Cc = Components.classes;
    let Cu = Components.utils;
    let makeURI = Cu.import("resource://gre/modules/BrowserUtils.jsm", {}).BrowserUtils.makeURI;

    const BASE_URI = "http://mochi.test:8888/chrome/dom/security/test/general/";
    const FAVICON_URI = BASE_URI + "favicon_bug1277803.ico";
    const LOADING_URI = BASE_URI + "bug1277803.html";
    let testWindow; //will be used to trigger favicon load

    let securityManager = Cc["@mozilla.org/scriptsecuritymanager;1"].
                          getService(Ci.nsIScriptSecurityManager);
    let expectedPrincipal = securityManager.createCodebasePrincipal(makeURI(LOADING_URI), {});
    let systemPrincipal = Cc["@mozilla.org/systemprincipal;1"].createInstance();

    // We expect 2 favicon loads, one from PlacesUIUtils.loadFavicon and one
    // from XUL:image loads.
    let requestXUL = false;
    let requestPlaces = false;

    function runTest() {
      // Register our observer to intercept favicon requests.
      let os = Cc["@mozilla.org/observer-service;1"].
               getService(Ci.nsIObserverService);
      let observer = {
        observe: function(aSubject, aTopic, aData)
        {
          // Make sure this is a favicon request.
          let httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
          if (FAVICON_URI != httpChannel.URI.spec) {
            return;
          }

          // Ensure the topic is the one we set an observer for.
          is(aTopic, "http-on-modify-request", "Expected observer topic");

          // Check for the correct loadingPrincipal, triggeringPrincipal.
          let triggeringPrincipal = httpChannel.loadInfo.triggeringPrincipal;
          let loadingPrincipal = httpChannel.loadInfo.loadingPrincipal;

          if (loadingPrincipal.equals(systemPrincipal)) {
            // This is the favicon loading from XUL, which will have the system
            // principal as its loading principal and have a content principal
            // as its triggering principal.
            ok(triggeringPrincipal.equals(expectedPrincipal),
              "Correct triggeringPrincipal for favicon from XUL.");
            requestXUL = true;
          } else if (loadingPrincipal.equals(expectedPrincipal)) {
            // This is the favicon loading from Places, which will have a
            // content principal as its loading principal and triggering
            // principal.
            ok(triggeringPrincipal.equals(expectedPrincipal),
              "Correct triggeringPrincipal for favicon from Places.");
            requestPlaces = true;
          } else {
            ok(false, "An unexpected favicon request.")
          }

          // Cleanup after ourselves...
          if (requestXUL && requestPlaces) {
            os.removeObserver(this, "http-on-modify-request");
            SimpleTest.finish();
          }
        }
      }
      os.addObserver(observer, "http-on-modify-request", false);

      // Now that the observer is set up, trigger a favicon load with navigation
      testWindow = window.open(LOADING_URI);
    }

    SimpleTest.waitForExplicitFinish();
    SimpleTest.registerCleanupFunction(function() {
      if (testWindow) {
        testWindow.close();
      }
    });
  ]]></script>

  <browser type="content-primary" flex="1" id="content" src="about:blank"/>
</window>
